﻿using System;
using System.Linq;
using System.Text;
using CRC.Inspecciones.Dominio.Clases;
using NHibernate;
using CRC.GestionSalones.Dominio.Clases;
using System.IO;
using System.Reflection;
using System.Collections.Generic;
using CRC.NHibernate;
using Iesi.Collections.Generic;
//using mshtml;
using System.Windows.Forms;

namespace CRC.Inspecciones.Dominio.Controlador
{
    class CtrlImpreso
    {
        private Impreso _impreso = null;
        private ISession _session = null;
        private static String sQryTiposImpresos = "select t.Id, t.Codigo from TipoImpreso t order by t.Descripcion";
        //private static String strQryExisteEntradaHistorial = "from LineaSeguimientoInspeccion lsi where lsi.Documento.Id=:idHoja";
        private static String strQryElementosTipoImpreso = "from ElementoImpreso ei where ei.TImpreso.Codigo=:codigo " +
            "and ei.PadreId is null and ei.Version=:version order by ei.Orden";

        public Impreso obtenerImpreso(int piImpreso, StringBuilder psContenidoDinamico)
        {     
            StringBuilder documentoHtml = null;
            _session = NHibernate.NHibernateHelper.GetCurrentSession();
            _impreso = (Impreso)_session.Load(typeof(Impreso), piImpreso);
            
            generarDocumentoConContenido(psContenidoDinamico);
            String sPlantilla = ObtenerPlantillaHtml();
            String aux = sPlantilla.Replace("#CONTENIDO#", psContenidoDinamico.ToString());
            documentoHtml = new StringBuilder(aux);
            psContenidoDinamico = documentoHtml;
            return _impreso;
        }

        /// <summary>
        /// Da de alta un impreso del tipo psCodigo en blanco y deja en psContenidodinamico el codigo html del mismo
        /// </summary>
        /// <param name="psCodigo">Codigo de impreso</param>
        /// <param name="piSalon">Salon para el que se rellena el impreso</param>
        /// <param name="psContenidodinamico">Paramentro de salida con el codigo html que se prepara</param>
        /// <returns>Impreso nuevo</returns>
        public Impreso nuevoImpreso(string psCodigo, int piSalon, StringBuilder psContenidodinamico)
        {

            ITransaction tx = null;
            String textoPlantilla = String.Empty;
            StringBuilder documentoHtml = null;

             try {

                 _session = NHibernateHelper.GetCurrentSession();
                 tx = _session.BeginTransaction();

                _impreso = new Impreso();
                IQuery qry = _session.CreateQuery("select from TipoImpreso where Codigo=:codigo").SetString("codigo", psCodigo);
                _impreso.Tipo = (TipoImpreso)qry.UniqueResult();
                _impreso.SalonInspeccionado = (Salon)_session.Load(typeof(Salon), piSalon);
                 
                 //la versió bona del CHECK_LIST es la "2" (10/11)
                _impreso.Version =  (_impreso.Tipo.Codigo == "CHECK_LIST")?  "2" : "1";
                _impreso.EsBorrador = true;
                _impreso.FechaCreacion = DateTime.Today;
                _impreso.UsuarioCreacion = 5; //Usuario generico
                _impreso.CongregacionAnfitriona = _impreso.SalonInspeccionado.Anfitriona().NombreCRC;
                _impreso.NumCongregacion = _impreso.SalonInspeccionado.Anfitriona().Numero.ToString();
                _impreso.Poblacion = _impreso.SalonInspeccionado.Municipio.Nombre1;
                _impreso.Provincia = _impreso.SalonInspeccionado.Municipio.Provincia.Nombre;
                
                textoPlantilla = ObtenerPlantillaHtml();
                generarDocumentoEnBlanco(psContenidodinamico);
                String aux = textoPlantilla.Replace("#CONTENIDO#", psContenidodinamico.ToString());
                documentoHtml = new StringBuilder(aux);
                psContenidodinamico = documentoHtml;
                
                 _session.Save(_impreso);
                _session.Flush();
                tx.Commit();
                return _impreso;

             }
             catch (HibernateException ex)
             {
                 if (tx != null)
                 {
                     tx.Rollback();
                     throw ex;
                 }
             }
             finally
             {
                 if (_session != null)
                     _session.Close();
             }
             return null;
            
        }

        public IList<Object[]> listarImpresos(int? pintAño, string psCodigoImpr, int? piZona)
        {
            ISession session = null;
            IList<Object[]> lstInfoImpresos = null;
            string hql = string.Empty;
            Boolean añoNulo, codigoImp, zonaNula;

            try
            {

                session = NHibernateHelper.GetCurrentSession();


                añoNulo = pintAño == null;
                codigoImp = string.IsNullOrEmpty(psCodigoImpr);
                zonaNula = piZona == null;
                hql = "select imp.Id, TImp.Codigo, imp.FechaCreacion, salon.Nombre_Salon, imp.EsBorrador " +
                    "from Impreso imp " +
                    "inner join imp.SalonInspeccionado as salon " +
                    "inner join imp.Tipo as TImp";

                if (!añoNulo) { hql += " where YEAR(imp.FechaCreacion)=" + pintAño; }
                if (!codigoImp) { hql += (añoNulo ? " where " : " and ") + " TImp.Codigo='" + psCodigoImpr + "'"; }
                if (!zonaNula) { hql += ((añoNulo && codigoImp) ? " where " : " and ") + " salon.Zona.Id=" + piZona; }

                hql += " order by imp.FechaCreacion desc";

                lstInfoImpresos = session.CreateQuery(hql).List<Object[]>();

                return lstInfoImpresos;
            }
            catch (HibernateException he)
            {
                throw he;
            }
            finally {
                if (session != null) session.Close();
            }
        }

        public void eliminarImpreso(int piImpreso)
        {
            ISession session = null;
            ITransaction tx = null;

            try
            {
                session = NHibernate.NHibernateHelper.GetCurrentSession();
                tx = session.BeginTransaction();
                session.Delete("from Impreso where Id=" + piImpreso.ToString());
                tx.Commit();
            }
            catch (HibernateException he)
            {
                if (tx != null) { tx.Rollback(); }
                throw he;
            }
            finally {
                if (session != null)
                session.Close();
            }
        }

        private void generarDocumentoEnBlanco(StringBuilder psContenidodinamico)
        {
            TipoImpreso tip = _impreso.Tipo;
            String sAux = "<table style=\"width: 100%;\">" +
                                   "<tr>" +
                                   "<td align=\"center\" colspan=\"3\"><strong><span id=\"titulo\">" +
                                   tip.Descripcion +
                                   "</span></strong></td>" +
                                   "</tr>" +
                                   "<tr><td colspan=\"3\">&nbsp;</td></tr>";

            psContenidodinamico.AppendLine(sAux);

            IQuery qry = _session.CreateQuery(strQryElementosTipoImpreso);
            qry.SetParameter("codigo", tip.Codigo);
            qry.SetParameter("version", _impreso.Version);

            List<ElementoImpreso> linies = (List<ElementoImpreso>)qry.List<ElementoImpreso>();
            foreach (ElementoImpreso el in linies)
            {
                    EscribirElemento(el, true, psContenidodinamico);
            }
            psContenidodinamico.Append("<table/>");
        }

        private void generarDocumentoConContenido(StringBuilder psContenidodinamico)
        {
            TipoImpreso tip = _impreso.Tipo;
            String sAux = "<table style=\"width: 100%;\">" +
                                "<tr>" +
                                "<td align=\"center\" colspan=\"3\"><strong><span id=\"titulo\">" +
                                tip.Descripcion +
                                "</span></strong></td>" +
                                "</tr>" +
                                "<tr><td colspan=\"3\">&nbsp;</td></tr>";

            psContenidodinamico.AppendLine(sAux);

            IQuery qry = _session.CreateQuery(strQryElementosTipoImpreso);
            qry.SetParameter("codigo", tip.Codigo);
            qry.SetParameter("version", _impreso.Version);

            List<ElementoImpreso> linies = (List<ElementoImpreso>)qry.List<ElementoImpreso>();
            foreach (ElementoImpreso el in linies)
            {
                    EscribirElementoConContenido(el, true, psContenidodinamico);
            }

            psContenidodinamico.Append("<table/>");
        }

        private String ObtenerPlantillaHtml()
        {
            String textoPlantilla = String.Empty;
            Stream inFile = Assembly.GetExecutingAssembly().GetManifestResourceStream("CRC.Inspecciones.Dominio.Clases.plantilla_impreso.txt");
            if (inFile == null) throw new Exception("No se encuentra la plantilla html.");
            if (inFile.Length == 0) throw new Exception("No se puede mostrar el impreso: plantilla vacia.");
            Byte[] buf = new Byte[inFile.Length];
            inFile.Read(buf, 0, buf.Length);
            textoPlantilla = System.Text.UnicodeEncoding.Unicode.GetString(buf);
            return textoPlantilla;

        }

        public IList<Object[]> listarTiposImpreso()
        {
            IList<Object[]> tipoHojasInsp = null;

            try
            {
                _session = NHibernateHelper.GetCurrentSession();

                tipoHojasInsp = _session.CreateQuery(sQryTiposImpresos).List<Object[]>();
                return tipoHojasInsp;

            }
            catch (HibernateException ex)
            {
                throw ex;
            }
            finally
            {
                if (_session != null) _session.Close();
            }
        }

        /// <summary>
        /// Escribe el elemento actual pElem y sus subelementos
        /// </summary>
        /// <param name="pElem">Elemento actual</param>
        /// <param name="psContenido">Cadena de salida donde se escribe el contenido dinamico</param>
        private void EscribirElemento(ElementoImpreso pElem, Boolean pTieneSubelementos, StringBuilder psContenido)
        {
             String sAux = String.Empty;

             switch (pElem.Tipo.Descripcion)
             {
                 case "label":
                     sAux += "<tr><td colspan=\"3\">";
                     sAux += "<table><tr><td class=\"BtxtBold\" align=\"left\">" + pElem.Texto + "</td></tr>"; //Se debe cerrar esta tabla al final
                     psContenido.AppendLine(sAux);
                     break;
                 case "checkbox":
                     sAux += "<tr><td>";
                     sAux += "<table width=\"100%\">";
                     sAux += "<tr>";
                     sAux += "<td class=\"Btxt\" align=\"left\" valign=\"top\"><input type=\"checkbox\" id=\"checkbox[" + pElem.Id + "]\" value=\"\"></td>";
                     sAux += "<td class=\"Btxt\" align=\"left\" valign=\"top\">&nbsp;</td>";
                     sAux += "<td class=\"Btxt\" align=\"justify\">" + pElem.Texto + "</td>";
                     sAux += "</tr>";

                     if (pElem.AdmiteComentario)
                     {
                         sAux += "<tr><td colspan=\"3\">";
                         sAux += "<textarea style=\"width: 795px;\" name=\"comentario[" + pElem.Id + "]\" class=\"textbox2\" id=\"comentario_id[" + pElem.Id + "]\">";
                         sAux += "</textarea></td></tr>";
                     }

                     sAux += "</table>";
                     sAux += "</td></tr>";
                     psContenido.AppendLine(sAux);
                     break;

                 case "textfield":

                     sAux += "<tr><td>";
                     sAux += "<table width=\"100%\">";
                     sAux += "<tr><td class=\"Btxt\" align=\"left\" valign=\"top\">" + pElem.Texto + "</td></tr>";
                     sAux += "<tr><td style=\"width: 795px;\"><input type=\"text\" id=\"textfield[" + pElem.Id+ "]\"></td></tr>";
                     sAux += "</tr></td>";

                     if (pElem.AdmiteComentario)
                     {
                         sAux += "<tr><td colspan=\"3\">";
                         sAux += "<textarea style=\"width: 795px;\" name=\"comentario[" + pElem.Id + "]\" class=\"textbox2\" id=\"comentario_id[" + pElem.Id + "]\">";
                         sAux += "</textarea></td></tr>";
                     }

                     sAux += "</table>";
                     sAux += "</td></tr>";
                     psContenido.AppendLine(sAux);
                     break;

                 case "textarea":

                     sAux += "<tr><td>";
                     sAux += "<table width=\"100%\">";
                     sAux += "<tr><td class=\"Btxt\" align=\"left\" valign=\"top\">" + pElem.Texto + "</td></tr>";
                     
                     sAux += "<tr><td>";
                     sAux += "<textarea style=\"width: 795px;\" name=\"textarea[" + pElem.Id + "]\" class=\"textbox2\" id=\"textarea[" + pElem.Id + "]\">";
                     sAux += "</textarea></td></tr>";

                     if (pElem.AdmiteComentario)
                     {
                         sAux += "<tr><td colspan=\"3\">";
                         sAux += "<textarea style=\"width: 795px;\" name=\"comentario[" + pElem.Id + "]\" class=\"textbox2\" id=\"comentario_id[" + pElem.Id + "]\">";
                         sAux += "</textarea></td></tr>";
                     }

                     sAux += "</table>";
                     sAux += "</td></tr>";
                     psContenido.AppendLine(sAux);
                     break;

                 case "radiobutton":
                     sAux += "<tr><td>";
                     sAux += "<table width=\"100%\">";
                     sAux += "<tr>";
                     sAux += "<td class=\"BtxtTextoRadio\">Si</td>";
                     sAux += "<td class=\"BtxtTextoRadio\">No</td>";
                     sAux += "<td class=\"BtxtTextoRadio\">N/A</td>";
                     sAux += "<td class=\"Btxt\" align=\"left\" valign=\"top\">&nbsp;</td>";
                     sAux += "</tr>";
                     sAux += "<tr>";
                     sAux += "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"1\"></input>";
                     sAux += "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"2\"></input>";
                     sAux += "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"3\"></input>";
                     sAux += "<td class=\"Btxt\" valign=\"top\" width=\"640px\">" + pElem.Texto + "</td>";
                     sAux += "</tr>";

                     if (pElem.AdmiteComentario)
                     {
                         sAux += "<tr><td colspan=\"4\">";
                         sAux += "<textarea style=\"width: 795px;\" name=\"comentario[" + pElem.Id + "]\" class=\"textbox2\" id=\"comentario_id[" + pElem.Id + "]\">";
                         sAux += "</textarea></td></tr>";
                     }
 
                     sAux += "</table>";
                     sAux += "</td></tr>";
                     psContenido.AppendLine(sAux);
                     break;

                 case "radiotext":

                     sAux += "<tr><td>";
                     sAux += "<table width=\"100%\">";
                     sAux += "<tr>";
                     sAux += "<td class=\"BtxtTextoRadio\">Si</td>";
                     sAux += "<td class=\"BtxtTextoRadio\">No</td>";
                     sAux += "<td class=\"BtxtTextoRadio\">N/A</td>";
                     sAux += "<td class=\"Btxt\" align=\"left\" valign=\"top\">&nbsp;</td>";
                     sAux += "</tr>";
                     sAux += "<tr>";
                     sAux += "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"1\"></input>";
                     sAux += "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"2\"></input>";
                     sAux += "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"3\"></input>";
                     sAux += "<td class=\"Btxt\" valign=\"top\" width=\"640px\">" + pElem.Texto + "</td>";
                     sAux += "</tr>";
                     sAux += "<tr><td colspan=\"4\"><input type=\"text\" style=\"width: 795px;\" id=\"radiotext[" + pElem.Id + "]\"></td></tr>";


                     if (pElem.AdmiteComentario)
                     {
                         sAux += "<tr><td colspan=\"4\">";
                         sAux += "<textarea style=\"width: 795px;\" name=\"comentario[" + pElem.Id + "]\" class=\"textbox2\" id=\"comentario_id[" + pElem.Id + "]\">";
                         sAux += "</textarea></td></tr>";
                     }

                     sAux += "</table>";
                     sAux += "</td></tr>";
                     psContenido.AppendLine(sAux);
                     break;

             }

            AnadirElementoImpreso(pElem);
            if (pTieneSubelementos)
            {
                List<Object[]> lstSubelmentos = pElem.ObtenerSubElementos();
                foreach (Object[] item in lstSubelmentos)
                {

                    EscribirElemento((ElementoImpreso)item[0], (long)item[1] > 1, psContenido);
                }
            }

            if (pElem.Tipo.Descripcion == "label")
            { //Cierre de tabla de los elementos de tipo label
                psContenido.AppendLine("</table></td></tr>");
            }

        }

        private void EscribirElementoConContenido(ElementoImpreso pElem, Boolean pTieneSubelementos, StringBuilder psContenido)
        {
            String sAux = String.Empty;
            String sAux2 = String.Empty;
            ElementoImpresoSalon elemImp = _impreso.ObtenerLineaImpreso(pElem.Id);
            if (elemImp == null)
            {
                elemImp = new ElementoImpresoSalon();
                elemImp.Elemento = pElem;
                elemImp.Impreso = _impreso;
                elemImp.SalonId = _impreso.SalonInspeccionado.Id;
                _impreso.LineasImpreso.Add(elemImp);
                
            }

            switch (pElem.Tipo.Descripcion)
            {
                case "label":
                    sAux += "<tr><td colspan=\"3\">";
                    sAux +="<table><tr><td class=\"BtxtBold\" align=\"left\">" + pElem.Texto + "</td></tr>"; //Se debe cerrar esta tabla al final
                    psContenido.AppendLine(sAux);
                    break;

                case "checkbox":
                    sAux += "<tr><td>";
                    sAux += "<table width=\"100%\">";
                    sAux += "<tr>";

                    //Marcamos el checkbox si toca
                    sAux2 = "<td class=\"Btxt\" align=\"left\" valign=\"top\"><input type=\"checkbox\" id=\"checkbox[" + pElem.Id + "]\" value=\"\" {0}></td>";
                    sAux += String.Format(sAux2, (elemImp.Valor) == "1" ? "checked" : "");
                    sAux += "<td class=\"Btxt\" align=\"left\" valign=\"top\">&nbsp;</td>";
                    sAux += "<td class=\"Btxt\" align=\"justify\">" + pElem.Texto + "</td>";
                    sAux += "</tr>";

                    if (pElem.AdmiteComentario)
                    {
                        sAux += "<tr><td colspan=\"3\">";
                        sAux += "<textarea style=\"width: 795px;\" name=\"comentario[" + pElem.Id + "]\" class=\"textbox2\" id=\"comentario_id[" + pElem.Id + "]\">";
                        sAux += elemImp.Comentario;
                        sAux += "</textarea></td></tr>";
                    }

                    sAux += "</table>";
                    sAux += "</td></tr>";
                    psContenido.AppendLine(sAux);
                    break;

                case "textfield":

                    sAux += "<tr><td>";
                    sAux += "<table width=\"100%\">";
                    sAux += "<tr><td class=\"Btxt\" align=\"left\" valign=\"top\">" + pElem.Texto + "</td></tr>";
                    sAux += "<tr><td style=\"width: 795px;\"><input type=\"text\" id=\"textfield[" + pElem.Id + "]\">" + elemImp.Valor + "</td></tr>";
                    
                    sAux += "</tr></td>";

                    if (pElem.AdmiteComentario)
                    {
                        sAux += "<tr><td colspan=\"3\">";
                        sAux += "<textarea style=\"width: 795px;\" name=\"comentario[" + pElem.Id + "]\" class=\"textbox2\" id=\"comentario_id[" + pElem.Id + "]\">";
                        sAux += elemImp.Comentario;
                        sAux += "</textarea></td></tr>";
                    }

                    sAux += "</table>";
                    sAux += "</td></tr>";
                    psContenido.AppendLine(sAux);
                    break;

                case "textarea":

                    sAux += "<tr><td>";
                    sAux += "<table width=\"100%\">";
                    sAux += "<tr><td class=\"Btxt\" align=\"left\" valign=\"top\">" + pElem.Texto + "</td></tr>";

                    sAux += "<tr><td>";
                    sAux += "<textarea style=\"width: 795px;\" name=\"textarea[" + pElem.Id + "]\" class=\"textbox2\" id=\"textarea[" + pElem.Id + "]\">";
                    sAux += elemImp.Valor;
                    sAux += "</textarea></td></tr>";

                    if (pElem.AdmiteComentario)
                    {
                        sAux += "<tr><td colspan=\"3\">";
                        sAux += "<textarea style=\"width: 795px;\" name=\"comentario[" + pElem.Id + "]\" class=\"textbox2\" id=\"comentario_id[" + pElem.Id + "]\">";
                        sAux += elemImp.Comentario;
                        sAux += "</textarea></td></tr>";
                    }

                    sAux += "</table>";
                    sAux += "</td></tr>";
                    psContenido.AppendLine(sAux);
                    break;
                case "radiobutton":
                    sAux +="<tr><td>";
                    sAux +="<table width=\"100%\">";
                    sAux += "<tr>";
                    sAux += "<td class=\"BtxtTextoRadio\">Si</td>";
                    sAux += "<td class=\"BtxtTextoRadio\">No</td>";
                    sAux += "<td class=\"BtxtTextoRadio\">N/A</td>";
                    sAux += "<td class=\"Btxt\" align=\"left\" valign=\"top\">&nbsp;</td>";
                    sAux += "</tr>";
                    sAux += "<tr>";
                    sAux2 = "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"1\" {0}></input>";
                    
                //Marcamos el radio que toque
                    sAux += String.Format(sAux2, (elemImp.Valor == "1") ? "checked" : "");
                    sAux2 = "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"2\" {0}></input>";
                    sAux += String.Format(sAux2, (elemImp.Valor == "2") ? "checked" : "");
                    sAux2 = "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"3\" {0}></input>";
                    sAux += String.Format(sAux2, (elemImp.Valor == "3") ? "checked" : ""); 

                    sAux += "<td class=\"Btxt\" valign=\"top\" width=\"640px\">" + pElem.Texto + "</td>";
                    sAux += "</tr>";

                    if (pElem.AdmiteComentario)
                    {
                        sAux += "<tr><td colspan=\"4\">";
                        sAux += "<textarea style=\"width: 795px;\" name=\"comentario[" + pElem.Id + "]\" class=\"textbox2\" id=\"comentario_id[" + pElem.Id + "]\">";
                        sAux += elemImp.Comentario;
                        sAux += "</textarea></td></tr>";
                    }

                    sAux += "</table>";
                    sAux +="</td></tr>";
                    psContenido.AppendLine(sAux);
                    break;

                case "radiotext":

                    sAux += "<tr><td>";
                    sAux += "<table width=\"100%\">";
                    sAux += "<tr>";
                    sAux += "<td class=\"BtxtTextoRadio\">Si</td>";
                    sAux += "<td class=\"BtxtTextoRadio\">No</td>";
                    sAux += "<td class=\"BtxtTextoRadio\">N/A</td>";
                    sAux += "<td class=\"Btxt\" align=\"left\" valign=\"top\">&nbsp;</td>";
                    sAux += "</tr>";
                    sAux += "<tr>";

                    //Marcamos el radio que toque
                    sAux2 = "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"1\" {0}></input>";
                    sAux += String.Format(sAux2, (elemImp.Valor == "1") ? "checked" : "");
                    sAux2 = "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"2\" {0}></input>";
                    sAux += String.Format(sAux2, (elemImp.Valor == "2") ? "checked" : "");
                    sAux2 = "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"3\" {0}></input>";
                    sAux += String.Format(sAux2, (elemImp.Valor == "3") ? "checked" : ""); 


                    //sAux += "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"1\"></input>";
                    //sAux += "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"2\"></input>";
                    //sAux += "<td valign=\"top\" align=\"center\"><input type=\"radio\" name=\"radiobutton[" + pElem.Id + "]\" value=\"3\"></input>";
                    
                    sAux += "<td class=\"Btxt\" valign=\"top\" width=\"640px\">" + pElem.Texto + "</td>";
                    sAux += "</tr>";
                    sAux += "<tr><td colspan=\"4\"><input type=\"text\" style=\"width: 795px;\" id=\"radiotext[" + pElem.Id + "]\" value=\"" + elemImp.Informacion + "\"></td></tr>";


                    if (pElem.AdmiteComentario)
                    {
                        sAux += "<tr><td colspan=\"4\">";
                        sAux += "<textarea style=\"width: 795px;\" name=\"comentario[" + pElem.Id + "]\" class=\"textbox2\" id=\"comentario_id[" + pElem.Id + "]\">";
                        sAux += "</textarea></td></tr>";
                    }

                    sAux += "</table>";
                    sAux += "</td></tr>";
                    psContenido.AppendLine(sAux);
                    break;
            }
            
            if (pTieneSubelementos){
                List<Object[]> lstSubelmentos = pElem.ObtenerSubElementos();
                foreach (Object[] item in lstSubelmentos) {

                    EscribirElementoConContenido((ElementoImpreso)item[0], (long)item[1] > 1, psContenido);
                }
            }
            
            if (pElem.Tipo.Descripcion == "label")
            { //Cierre de tabla de los elementos de tipo label
                psContenido.AppendLine("</table></td></tr>");
            }
        }

        /// <summary>
        /// Anade un ElementoImpresoSalon del tipo pElemImp al impreso _impreso
        /// </summary>
        /// <param name="pElemImp"></param>
        private void AnadirElementoImpreso(ElementoImpreso pElemImp) { 
            ElementoImpresoSalon ies = new ElementoImpresoSalon();
            ies.Elemento = pElemImp;
            ies.SalonId = _impreso.SalonInspeccionado.Id;
            _impreso.LineasImpreso.Add(ies);
            ies.Impreso = _impreso;
        }

        public List<Object[]> obtenerSubElementos(ElementoImpreso pElem) {
            List<Object[]> lst = new List<Object[]>();
            String strQryObtenerElementosImpreso = "select el, count(el) from ElementoImpreso el " +
                 "left join el.SubElementos sub " +
                 "where el.PadreId=:padre_id " +
                 "group by el";

                 _session = NHibernateHelper.GetCurrentSession();
                 IQuery qry = _session.CreateQuery(strQryObtenerElementosImpreso);
                 qry.SetParameter("padre_id", pElem.Id);
                 lst = (List<Object[]>)qry.List<Object[]>();


            return lst;
        }

        /// <summary>
        /// Guarda el impreso. Tanto los datos fijos, como los dinamicos
        /// </summary>
        /// <param name="pImpreso">Impreso a guardar</param>
        /// <param name="pEsBorrador">Es borrador</param>
        /// <param name="pFechaInspeccion">Fecha de la inspeccion</param>
        /// <param name="pFechaSolucion">Fecha en la que se aporta la solucion</param>
        /// <param name="pFirmaInspector">Firma del inspector</param>
        /// <param name="pFirmaCoord">Firma del coordinador u otro responsable</param>
        /// <param name="doc">Documento rellenado</param>
        public void guardarImpreso(Impreso pImpreso, 
            Boolean pEsBorrador, 
            DateTime pFechaInspeccion, 
            DateTime pFechaSolucion,
            String pFirmaInspector,
            String pFirmaCoord,
            System.Windows.Forms.HtmlDocument doc)
        {

            //Datos fijos
            _impreso.EsBorrador = pEsBorrador;
            if (pFechaInspeccion != DateTime.MinValue) { _impreso.FechaInspeccion = pFechaInspeccion.ToShortDateString(); }
            if (pFechaSolucion != DateTime.MinValue) { _impreso.FechaSolucion = pFechaSolucion.ToShortDateString(); }
            _impreso.FirmaInspector = pFirmaInspector;
            _impreso.FirmaCoordinador = pFirmaCoord;


            //Datos dinamicos
            foreach (ElementoImpresoSalon eis in pImpreso.LineasImpreso)
            {
                switch (eis.Elemento.Tipo.Descripcion)
                {
                    case "checkbox":
                        HtmlElement checkbox = doc.GetElementById("checkbox[" + eis.Elemento.Id + "]");
                        eis.Valor = checkbox.GetAttribute("checked") == "True" ? "1" : "2";
                        break;

                    case "textfield":
                        HtmlElement inputText = doc.GetElementById("textfield[" + eis.Elemento.Id + "]");
                        eis.Valor = inputText.GetAttribute("value");
                        break;

                    case "radiobutton":

                        for (int i = 0; i <= doc.GetElementsByTagName("input").Count - 1; i++)
                        {
                            HtmlElement elem = doc.GetElementsByTagName("input")[i];
                            if (elem.GetAttribute("type") == "radio" && 
                                elem.GetAttribute("name") == "radiobutton[" + eis.Elemento.Id + "]")
                            {
                                if (elem.GetAttribute("checked") == "True")
                                { 
                                    eis.Valor = elem.GetAttribute("value"); break;
                                }
                            }
                        }
                        break;
                    case "textarea":

                        HtmlElement textarea = doc.GetElementById("textarea[" + eis.Elemento.Id + "]");
                        if (textarea != null) eis.Valor = textarea.InnerHtml;
                        break;

                    case "radiotext":

                        for (int i = 0; i <= doc.GetElementsByTagName("input").Count - 1; i++)
                        {
                            HtmlElement elem = doc.GetElementsByTagName("input")[i];
                            if (elem.GetAttribute("type") == "radio" &&
                                elem.GetAttribute("name") == "radiobutton[" + eis.Elemento.Id + "]")
                            {
                                if (elem.GetAttribute("checked") == "True")
                                {
                                    eis.Valor = elem.GetAttribute("value");
                                }
                            } else if (elem.GetAttribute("type") == "text" &&
                                elem.GetAttribute("name") == "radiotext[" + eis.Elemento.Id + "]")
                            {
                                eis.Informacion = elem.GetAttribute("value");
                            }
                        }

//                        inputText = doc.GetElementById("textfield[" + eis.Elemento.Id + "]");
                        break;

                }

                if (eis.Elemento.AdmiteComentario)
                {
                    HtmlElement textarea = doc.GetElementById("comentario_id[" + eis.Elemento.Id + "]");
                    if (textarea != null)eis.Comentario = textarea.InnerHtml;
                }
            }

            _session.Save(_impreso);
            _session.Flush();
        }
    
    }
        

    }
